昨天說明了列表(List) 跟集(Set) 的新增與刪除元素,今天來說明同為集合但與其他人有著些許不同新增與刪除方法的對映(Map)。
新增元素
可以透過加入一個鍵值對 (Pair<Key, Value>) 或是另一個對映去加入,如果透過 +
去做新增元素,則結果會回傳原本的對映加上新的對映或是 Pair。
承上,如果我們希望透過 +=
去新增,則原本的對映就必須是可變對映 (Mutable Map)。
第三行的新增,可以對既有的鍵 (Key) 進行新增會觸發更新,所以 one
被更新成 11
。
val numberMap = mapOf("one" to 1, "two" to 2, "three" to 3)
val mutableNumberMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
numberMap += Pair("ten", 10) // Error: val can not be reassigned
mutableNumberMap += Pair("ten, 10) // {one=1, two=2, three=3, ten=10}
mutableNumberMap += mapOf("five" to 5, "one" to 11)
// {one=11, two=2, three=3, ten=10, five=5}
除了使 plus
(+
) 之外,我們也可以使用 put()
, set()
, []
去修改一個對映,此時就會強制要求目標對映是一個可變的變數。
使用特性除了是直接修改外,遇到重複鍵值得處理與 plus
並無相異。
val mutableNumberMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
mutableNumberMap.put("four", 4) // {one=1, two=2, three=3, four=4}
mutableNumberMap.put("one", 0) // {one=0, two=2, three=3, four=4}
mutableNumberMap["five"] = 5 // {one=0, two=2, three=3, four=4, five=5}
// 上面一行等價於 mutableNumberMap.set("five", 5)
如果要對 多個 元素進行新增修改,則可以使用 plusAll()
操作。
val mutableNumberMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
mutableNumberMap.plusAll mapOf("four" to 4, "five" to 5))
// {one=1, two=2, three=3, four=4, five=5}
刪除元素
對於一個對映,刪除元素需要給定欲刪除的鍵值 (Key),它可以是單一個存在也可以是透過列表儲存負數個鍵值。
透過下方範例可以知道,當想要刪除不存在的鍵值,Kotlin 並不會做出任何行為,會直接乎列這項要求。
val mutableNumberMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
mutableNumberMap -= "one" // {two=2, three=3}
mutableNumberMap -= listOf("two", "four") // {three=3}
除了使用 minus
(-
) 之外,也可以使用 remove
去移除指定元素,除了可以透過鍵值去移除元素, remove
函示還可以透過對映裡的值 (value) 進行移除 (需要在 remove
前加上 .values
),若值有複數個存在,則會對第一個擁有該值的鍵值隊進行移除 (筆者本人對這種移除項非固定寫法並不是很推薦,這種寫法可能會讓 debugging 需要的功增加)
如果需要同時移除多個元素則可以透過
val mutableNumberMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3, "threeAgain" to 3)
mutableNumberMap.remove("one") // {two=2, three=3, threeAgain=3}
mutableNumberMap.values.remove(3) // {two=2, threeAgain=3}
val mutableNumberMap2 = mutableMapOf("one" to 1, "two" to 2, "three" to 3, "threeAgain" to 3)
mutableNumberMap2.values.removeAll(listOf(2, 3)) // {one=1}
明日預告:明天不出意外會迎來集合的最後一篇,會以對映的過濾 (filter) 以及查找為主,內容會包含前面提過的可空性,歡迎大家回去複習一下 XD